package com.ebid;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.StringReader;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;
import org.xml.sax.InputSource;
public class XmlNodeAnalysiser {

    public static void main(String[] args) throws JDOMException, IOException {
        getXmlDoc("qualifyBulletinPhase.xml");
    }
    public static void getXmlDoc(String xmlFile) throws JDOMException, IOException{
        File file = new File(xmlFile);//"注：输入文件路径",输入您的文件url，找到该xml文件
        FileInputStream fis = new FileInputStream(file);//以文件流形式读入xml文件
        int size = fis.available();
        byte[] buffer = new byte[size];//初始化文件流byte数字
        fis.read(buffer);//读取文件数据导数组中
        fis.close();//关闭文件流
        //创建一个新的字符串
        StringReader read = new StringReader(new String(buffer,"UTF-8"));//将xml的文件流以某种格式转换为字符串，此处为UTF-8
        //创建org.xml.sax.InputSource对象，以便使用SAXBuilder
        InputSource source = new InputSource(read);
        //创建一个新的SAXBuilder
        SAXBuilder sb = new SAXBuilder();
        //通过输入源构造一个Document
        Document doc = sb.build(source);
        //取的根元素
        Element root = doc.getRootElement();
        System.out.println(root.getName());//输出根元素的名称
        //得到根元素所有子元素的集合
        List jiedian = root.getChildren();
        //获得XML中的命名空间（XML中未定义可不写）
        Namespace ns = root.getNamespace();

        loopXmlEle(jiedian);//递归算法，进入正题

    }
    /**
     * 利用递归调用
     * @param jiedian 开始解析xml节点,就是从哪个标签开始向下解析
     */
    private static void loopXmlEle(List jiedian){
        int thisListSize = jiedian.size();
        List zjd = null;
        if(thisListSize!=0){//判断若没有数据直接结束
            Element et = null;
            Element et1 = null;
            for(int i=0;i<thisListSize;i++){
                et = (Element) jiedian.get(i);//得到该层数据
                System.out.println("父节点"+et.getName());
                if("Row".equals(et.getName())){//注意这里这个"Row"代表你想要递归到xml节点的那一层级，如 Table下有Row，Row下有Cell，你如果想得到每一个Row里面的Cell，就写Row。
                    zjd = et.getChildren();//（"Row"是我想要的,所以进来）
                    for(int j=0;j<zjd.size();j++){//遍历Row层级
                        et1 = (Element) zjd.get(j);
                        System.out.println("叶子节点"+et1.getName()+"="+et1.getValue());//这里是末级节点了，如果你下面还有节点，可以继续写循环，这里不做举例了，有问题联系我QQ:114846108
                    }
                }else{
                    loopXmlEle(et.getChildren());//如果不是“Row”（你想要的节点，则继续递归调用）。调用自身的时候，传入的是et的Children（下一个层级）
                }
            }
        }

    }

}
